/**
 * 检查URL是否为HTTP/HTTPS协议
 * @param url 待检查的URL字符串
 * @returns 如果是HTTP/HTTPS协议返回true，否则返回false
 */
export function isHttp(url) {
  return url.includes('http://') || url.includes('https://')
}

/**
 * 检查路径是否为外部链接
 * @param path 待检查的路径字符串
 * @returns 如果是http/https/mailto/tel协议的外部链接则返回true，否则返回false
 */
export function isExternal(path) {
  return /^(?:https?:|mailto:|tel:)/.test(path)
}

/**
 * 验证用户名是否有效
 * @param {string} str - 待验证的用户名字符串
 * @returns {boolean} 如果用户名在有效列表中则返回true，否则返回false
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.includes(str.trim())
}

/**
 * 验证URL格式是否合法
 * @param url - 需要验证的URL字符串
 * @returns 返回布尔值，true表示URL格式合法，false表示不合法
 */
export function validURL(url) {
  const reg = /^(?:https?|ftp):\/\/(?:[A-Za-z0-9.-][A-Za-z0-9.&%$-]*@)*(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d?)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}|(?:[A-Za-z0-9-]+\.)*[A-Za-z0-9-]+\.(?:com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[A-Za-z]{2}))(?::\d+)*(?:\/(?:$|[\w.,?'\\+&%$#=~-]+))*$/
  return reg.test(url)
}

/**
 * 验证字符串是否全部由小写字母组成
 * @param str 待验证的字符串
 * @returns 如果字符串全部由小写字母组成则返回true，否则返回false
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * 验证字符串是否全部由大写字母组成
 * @param str 待验证的字符串
 * @returns 如果字符串全部由大写字母组成则返回true，否则返回false
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * 验证字符串是否只包含字母（不区分大小写）
 * @param str 待验证的字符串
 * @returns 如果字符串只包含字母则返回true，否则返回false
 */
export function validAlphabets(str) {
  const reg = /^[A-Z]+$/i
  return reg.test(str)
}

/**
 * 验证邮箱格式是否合法
 * @param email - 待验证的邮箱字符串
 * @returns 返回布尔值，true表示邮箱格式合法，false表示不合法
 */
export function validEmail(email) {
  const reg = /^(?:[^<>()[\]\\.,;:\s@"]+(?:\.[^<>()[\]\\.,;:\s@"]+)*|".+")@(?:\[\d{1,3}(?:\.\d{1,3}){3}\]|(?:[a-z0-9-]+\.)+[a-z]{2,})$/i
  return reg.test(email)
}

/**
 * 检查传入值是否为字符串类型
 * @param value - 待检查的值
 * @returns 如果是原始字符串或 String 对象则返回 true，否则返回 false
 */
export function isString(value: unknown): value is string {
  // typeof 能识别原始字符串
  if (typeof value === 'string') {
    return true
  }
  // Object.prototype.toString 能识别 String 对象（避免 instanceof 的跨环境问题）
  return Object.prototype.toString.call(value) === '[object String]'
}

/**
 * 检查传入参数是否为数组
 * @param arg 待检查的参数
 * @returns {boolean} 如果参数是数组则返回true，否则返回false
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}
